// Program Termination (程序终止) 示例
program ProgramTerminationExample;

{$mode objfpc}{$H+}

uses
  SysUtils;

var
  UserInput: string;
  ExitCode: Integer;

// 退出处理过程
procedure ExitHandler;
begin
  WriteLn('程序正在退出，执行清理工作...');
  WriteLn('保存数据...');
  WriteLn('关闭文件...');
  WriteLn('释放资源...');
end;

// 模拟一些需要清理的资源
procedure InitializeResources;
begin
  WriteLn('初始化程序资源...');
  AddExitProc(ExitHandler); // 添加退出处理过程
end;

// 演示不同方式的程序终止
procedure DemonstrateTerminationMethods;
var
  Choice: Integer;
begin
  WriteLn('演示程序终止的不同方式:');
  WriteLn('1. 正常执行结束');
  WriteLn('2. 使用 Exit 过程');
  WriteLn('3. 使用 Halt 函数');
  WriteLn('4. 带退出码的 Halt 函数');
  WriteLn('请选择 (1-4): ');
  
  ReadLn(Choice);
  WriteLn;
  
  case Choice of
    1: WriteLn('选择正常执行结束，程序将继续执行到最后');
    2: begin
         WriteLn('使用 Exit 过程退出主程序块');
         Exit;
       end;
    3: begin
         WriteLn('使用 Halt 函数立即终止程序');
         Halt;
       end;
    4: begin
         WriteLn('使用 Halt(1) 函数带退出码终止程序');
         Halt(1);
       end;
  else
    WriteLn('无效选择，使用默认方式');
  end;
end;

begin
  WriteLn('=== Pascal 程序终止示例 ===');
  WriteLn;
  
  // 初始化资源
  InitializeResources;
  
  // 演示不同终止方式
  DemonstrateTerminationMethods;
  
  // 正常执行流程
  WriteLn('程序正常执行到最后...');
  WriteLn('输入任意字符退出程序: ');
  ReadLn(UserInput);
  
  // 设置退出码
  ExitCode := 0;
  WriteLn('程序正常退出，退出码: ', ExitCode);
  
  // 程序将在这里自然结束
end.